package bbalgae.swing.outline;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.KeyStroke;
import javax.swing.border.EmptyBorder;
/*
 * 	이벤트 처리하기
 * 	스윙은 이벤트 중심 event-driven임
 * 컴포넌트는 이벤트를 발생할 수 있고 개발자는 이것을 처리하는 코드를 작성해야 함.
 * 이벤트 중심 패러다임은 스윙 뿐만 아니라 모든 GUI프로그램에 적용되는 사용자 상호작용의 근간(뿌리,핵심)임
 * 스윙의 이벤트 처리방식을 알아보기 전에 먼저 자바의 이벤트 처리 방식을 배워야함.
 * 
 * 자바이벤트처리 모델
 * 자바에서 모든 객체는 자신의 상태변화를 다른 객체에게 알릴수 있음
 * event-driven 프로그래밍에서 이벤트는 객체의 상태 변화를 의미 함.
 * 이 모델에는 3가지가 참여자가 존재
 * 이벤트 source : 상태가 변경된 객체
 * 이벤트 object : 이벤트 소스의 상태변경을 캡슐화 한것
 * 이벤트 listener :  이벤트 소스의 상태변경을 통지하고 싶어하는 객체
 * 간단히 정리하면, 이벤트가 발생하면 이벤트 소스는 이벤트 객체를 만들어서 이벤트 리스너에게 보냄
 * 이벤트 소스
 * 모든 객체는 이벤트 소스가 될 수 있음
 * 이벤트 소스 클래스는 이벤트 리스너가 관심있어 하는 이벤트를 받으면 그것을 등록하거나 제거할 수 있는 메소드를
 * 제공해야함 예를 들어, JMenuItem이 클릭되면 java.awt.ActionEvent를 발생함. 따라서, JMenuItem에는 
 * addActionListener와 removeActionListener메소드를 제공 한다.
 * 
 * 이벤트 객체
 * 이벤트 객체는 변경전 값과 변경후 새로운 값등의 이벤트의 특정 유형에 대한 정보들이 캡슐화 되어 있다.
 * 모든 이벤트 소스에는 이것을 반환하는 getSource메소드를 가지고 있음.
 * 
 * 이벤트 리스너
 * 특정 유형의 이벤트를 처리하기 위해 반드시 구현해야 하는 인터페이스를 의미 
 * 모든 리스너 인터페이스는 java.util.EventListener의 하위 인터페이스임
 * 
 *	 이벤트 리스너 인터페이스는 반드시 해당 이벤트 객체를 받을 수 있는 메소드가 정의 되어야함 .
 * actionPerformed(ActionEvent e)
 * 
 * 스윙에서 이벤트를 처리하려면 단지 이벤트 리스너를 작성해야 함
	왜냐하면, 스윙의 기본 이벤트 처리에서 이벤트 소스와 이벤트 객체를 미리 작업해 줌
	
	스윙에서 다뤄야하는 이벤트 종류
	ActionEvent - ActionListener	 -> JMenuItem, JButton등의 버튼들
	KeyEvent - KeyListener -> 거의 대부분의 스윙 컴포넌트들
	MouseEvent - MouseListener  -> 거의 대부분의 스윙 컴포넌트들
	WindowEvent - WindowListener -> JFrame, JDialog등의 컨테이너 
 */


public class J07_HelloSwingEvent extends JFrame {

	private JPanel contentPane;
	private Container mnFile;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J07_HelloSwingEvent frame = new J07_HelloSwingEvent();
					
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J07_HelloSwingEvent() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		J07_HelloswingActionListener mnActionlistener= new J07_HelloswingActionListener();

		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnFilef = new JMenu("File (F)");
		menuBar.add(mnFilef);
		
		JMenuItem mntmNewn = new JMenuItem("New (N)");
		mntmNewn.addActionListener(mnActionlistener);
		mntmNewn.setActionCommand("new");
		mnFilef.add(mntmNewn);
		
	
		
		JMenuItem mntmClosec = new JMenuItem("Close (C)");
		mntmClosec.addActionListener(mnActionlistener);
		mntmClosec.setActionCommand("close");
		mnFilef.add(mntmClosec);
		

		
		JMenuItem mntmExite = new JMenuItem("Exit (E)");
		mntmExite.addActionListener(mnActionlistener);
		mntmExite.setActionCommand("exit");
		mnFilef.add(mntmExite);
		

		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
	

		
		
	}
}

	
	
	